﻿//efficiency.h
#pragma once

#include <hash_map>
#include <string>
#include <Windows.h>

namespace sbase
{
	/** \ingroup Interface
	* \brief 效率评估设备,用来统计代码执行所用的时间
	*
	* Describe:使用cpu的循环周期数，来统计代码执行所使用的cpu循环周期。用来作为程序优化的评估工具
	*/
	class IEfficiency
	{
	public:
		virtual ~IEfficiency(){}

		/**
		* \brief 开始一个效率评估节点的记录。
		*
		* Describe:
		* \param Name 节点的名字 
		*/
		virtual void beginRecord(const char* Name) = 0;
		/**
		* \brief 结束一个效率评估节点的记录
		*
		* Describe:
		* \param Name 节点的名字 
		*/
		virtual void endRecord(const char* Name) = 0;

		/**
		* \brief 更新所有效率评估设备的节点
		*
		* Describe:每桢累加.
		*/
		virtual void update() = 0;

		/**
		* \brief 输出当前桢的效率
		*
		* Describe:设备在这里记录效率到文件
		* \param bCurrentFrame 是否只输出当前桢的效率. 否则输出从开始运行到现在的效率统计
		*/
		virtual void Dump(bool bCurrentFrame, void (*)(const char*,...)) = 0;

		virtual void Dump(bool bCurrentFrame) = 0;

		virtual HANDLE GetRecord(const char* Name)=0;
	};


	struct SRecordNode
	{
		LARGE_INTEGER m_BeginTimeMs;// 统计的开始时间
		LARGE_INTEGER m_EndTimeMs;	// 统计的结束时间
		LARGE_INTEGER m_TotelTime;	// 从开始统计运行到现在总共时间
		LARGE_INTEGER m_FrameTime;	// 本桢的时间统计
		int m_TotelCount;			// 从开始统计运行到现在,节点被调用的次数
		int m_FrameCount;			// 在一桢内,节点被调用的次数
	};


	/** \ingroup Engine
	  * \brief 效率评估设备的实现类
	  *
	  * Describe:这个类实现了效率评估设备的接口
	  */
	class CEfficiency : public IEfficiency
	{
		typedef stdext::hash_map<std::string,SRecordNode> RecordMap;
		RecordMap m_RecordMap;

		LARGE_INTEGER m_CpuFreq;

		FILE * m_fp;
		int m_nID;
		TCHAR m_szFileName[MAX_PATH];

	public:
		CEfficiency();
		~CEfficiency();

		bool OpenFile(char* lpszFileName);
		
		void update();

		void beginRecord(const char* Name);
		void endRecord(const char* Name);

		HANDLE GetRecord(const char* Name);
		void beginRecordEx(HANDLE hRecord);
		void endRecordEx(HANDLE hRecord);

		void Dump(bool bCurrentFrame);
		void Dump(bool bCurrentFrame, void (*PrintEfficiencyLog)(const char*,...));
	};
}